#ifndef DIALOGOPRINCIPAL_H
#define DIALOGOPRINCIPAL_H

#include <QtGui/QDialog>
#include "ui_dialogoprincipal.h"
#include "variable.h"
#include "factoriavariables.h"

class VariableTest : public Variable
{
public:
    VariableTest(const QString& nombre, const Valor& valor) {
        this->nombre = nombre;
        this->valor = valor;
    }
    Valor getValor() const { return valor; }
    void setValor(const QString& textoValor, int tipo) { 
        valor = textoValor;
        valor.setTipo(tipo);
    }

    void setNombre(const QString& nombre) {
        this->nombre = nombre;
    }

    QString getNombre() { return nombre; }
    int getTipo() { return valor.getTipo(); }
    
private:
    Valor valor;
    QString nombre;
};

class FactoriaVariablesTest : public FactoriaVariables
{
public:
    Variable* crearVariable(const QString& nombre) {
        foreach (VariableTest* variable, *listaVariables) {
            if (variable->getNombre() == nombre) {
                return new VariableTest(nombre, variable->getValor());
            }
        }
        return NULL;
    }

    Funcion* crearFuncion(const QString& nombre) {
        return NULL;
    }

    void setListaVariables(QList<VariableTest*>* listaVariables) {
        this->listaVariables = listaVariables;
    }

private:
    QList<VariableTest*>* listaVariables;
};


class ModeloVariables : public QAbstractListModel
{
    Q_OBJECT
public:
    ModeloVariables(QObject *parent = 0)  :  QAbstractListModel(parent) {        
    }

    virtual ~ModeloVariables() {
    }

    void actualizar() {
        layoutAboutToBeChanged();
        layoutChanged();
    }

    int rowCount(const QModelIndex& parent) const { 
        return listaVariables->size();
    }

    int columnCount(const QModelIndex& parent) const { 
        return 3;
    }

    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const {
        if (!index.isValid()) {
            return QVariant();
        }

        VariableTest* variable = listaVariables->at(index.row());

        if (role != Qt::DisplayRole) {
            return QVariant();
        }        
        if (index.column() == 0) {              
            return QVariant(variable->getNombre());
        } 
        return QVariant();
    }

    void setListaVariables(QList<VariableTest*>* listaVariables) {
        this->listaVariables = listaVariables;
    }
    VariableTest* getVariable(int indice) {
        return listaVariables->at(indice);
    }

private:
    QList<VariableTest*>* listaVariables;
};

class DialogoPrincipal : public QDialog
{
    Q_OBJECT

public:
    DialogoPrincipal(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~DialogoPrincipal();

protected:
    void crearEditoresTabla();
    //QWidget* crearEditor(VariableTest* variable);
    void actualizarVariables();

protected slots:
    void on_botonEvaluar_clicked();
    void on_botonAgregarVariable_clicked();

private:
    Ui::DialogoPrincipalClass ui;

    QStringList listaTipos;

    QList<VariableTest*> listaVariables;
    ModeloVariables modeloVariables;

    FactoriaVariablesTest factoriaVariables;
};

#endif // DIALOGOPRINCIPAL_H
